/**
 * 
 */
package io;

import general.Page;
import gui.TextArea;

import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream.GetField;

import javax.xml.soap.Text;

import ch.fhnw.filecopier.*;

import classificationEtSelection.Cluster;

/**
 * Classe permettant de regler les sorties du programme pour la partie classification et selection, c'est a dire une arborescence de dossiers correspondants à des cluster, et les pages qui sont dans ces clusters
 *@author remi
 *@version 1.0
 */
public class ExporterPagesToHTML {


	/**
	 * Variable representant le prefixe commun du nom des repertoire de chaque cluster. les repertoire de cluster s'appelleront ainsi {@link #paternNomRepertoireCluster}X ou X est le numero du cluster
	 */
	public static String paternNomRepertoireCluster = "cluster_";

	/**
	 * Fonction permettant de creer un repertoire corrspondant au cluster passé en argument, et de le remplir avec les fichier html correspondants aux pages dans le cluster
	 *<br>verifier la validitée du fichier ( le repertoire existe bien? )
	 *<br>creer un repertoire dans le repertoire donné en argument portant le nom de {@link #paternNomRepertoireCluster} X ou X est le numéro du cluster
	 *<br>pour chaque page dans le cluster :
	 *<right> <br>copier le fichier html correspondant a la destination voulue
	 *</right> <br>
	 * @param cluster le cluster qu'on va materialiser sur le disque
	 * @param repertoireRacineDestination le repertoire racine dans laquel serra créér le repertoire du cluster
	 * @return true ou false si erreur
	 */
	public static boolean clusterToFichier(Cluster cluster, File repertoireRacineDestination){
		// TODO clusterToFichier test unitaire ...

		//on verifie que l'argument est bien un repertoire
		if(repertoireRacineDestination.isDirectory()==false){
			System.err.println("attention, on essaye de créer un dossier pour y ecrire les dossier de cluster mais le dossier racine proposé n'est pas un dossier!");
			TextArea.effacerPuisEcrireMsg("attention, on essaye de créer un dossier pour y ecrire les dossier de cluster mais le dossier racine proposé n'est pas un dossier!");
			System.exit(1);
		}
		//verifier l'existence du repertoire passé en argument
		try {
			if(repertoireRacineDestination.createNewFile()==true){
				System.out.println("on essaye d'ecrire les clusters dans un repertoire qui n'existe pas, ce repertoire est donc crée");
				TextArea.effacerPuisEcrireMsg("on essaye d'ecrire les clusters dans un repertoire qui n'existe pas, ce repertoire est donc crée");
			}
		} catch (IOException e) {
			System.err.println("erreur, on a essayé de créer un dossier racine pour l'ecriture des repertoires de cluster, mais le repertoire n'a pas pu etre cree");
			TextArea.effacerPuisEcrireMsg("erreur, on a essayé de créer un dossier racine pour l'ecriture des repertoires de cluster, mais le repertoire n'a pas pu etre cree");
			e.printStackTrace();
		}

		//créér un repertoire dans le repertoire racine portant le nom de ...
		
		//vider le repertoire:
		

		//test d'abord si le repertoir existe déja
		File repertoireNouveauCluster;
		if (cluster.isUtile() == true)
		{

			//repertoireNouveauCluster = new File(repertoireRacineDestination,ExporterPagesToHTML.paternNomRepertoireCluster+"num_"+cluster.getNumero()+ "__est_utile_" + "_contient_" + cluster.getPages().size() + "_pages" );			
			repertoireNouveauCluster = new File(repertoireRacineDestination,ExporterPagesToHTML.paternNomRepertoireCluster+"_"+cluster.getNumero()+ "_" + cluster.isUtile()+ "_contient_" + cluster.getPages().size() + "_pages" );			
			
		}
		else
		{
			repertoireNouveauCluster = new File(repertoireRacineDestination,ExporterPagesToHTML.paternNomRepertoireCluster+"_"+cluster.getNumero()+ "_" + cluster.isUtile()+ "_contient_" + cluster.getPages().size() + "_pages" );
		}
		if(repertoireNouveauCluster.exists()==true){//cas ou le repertoire existe deja, on le supprime alors
			TextArea.ecrireMsg("on ecrase un cluster deja ecrit");
			repertoireNouveauCluster.delete();
		}

		//on cree le repertoire de destination
		repertoireNouveauCluster.mkdir();

		int nombrePages = cluster.getPages().size();
		Source[] sourcesFichiersACopier  = new Source[nombrePages];
		String[] destinationFichiersACopier = new String[nombrePages];

		//pour chaque fichier
		for(int i = 0; i < cluster.getPages().size();i++){
			try {
				sourcesFichiersACopier[i] = new Source(cluster.getPages().get(i).getFichier().getCanonicalPath());
				destinationFichiersACopier[i]  = repertoireNouveauCluster.getCanonicalPath();
			} catch (IOException e) {
				System.err.println("probleme lors de la copie de fichier");
				e.printStackTrace();
			}
		}


		// on cree un copyJob avec toutes les copy a faire
		CopyJob copyJob = new CopyJob(sourcesFichiersACopier, destinationFichiersACopier);
		FileCopier fileCopier = new FileCopier();
		try {
			
			
//			System.out.println("verification du contenu du copyjob \n ");
//			System.out.println("copyjob : " + "\n");
//			for(int i =0;i<cluster.getPages().size() ;i++){
//				System.out.println("source: "+copyJob.getSources()[i].getPattern()+" destination :"+copyJob.getDestinations()[i]);
//			}
//			System.out.println("\n_\n");
			
			
			
			fileCopier.copy(copyJob);
		} catch (IOException e) {
			System.err.println("erreur lors de l'operation de copie groupée");
			e.printStackTrace();
		}

		
		System.out.println("fin de la copie, le repertoire "+ repertoireNouveauCluster.getName() + " contient : "+repertoireNouveauCluster.list(null).toString() );

		return true;
	}




	/**
	 * Main de test de la classe ExporterPagesToHTML
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO MExporterPagesToHTML main de test : à remplir
		System.out.println("Début de la création du repertoire");


		File repertoire = new File("outputHTML");
		File repertoireNouveauCluster = new File(repertoire,ExporterPagesToHTML.paternNomRepertoireCluster+1);
		boolean titi = repertoireNouveauCluster.mkdir();


		try {
			boolean toto = repertoireNouveauCluster.createNewFile();
			System.out.println("la valeur de retour de la fonction de creation : "+toto);
			System.out.println("la valeur de retour de la fonction de mkdir : "+titi);
			repertoireNouveauCluster.setExecutable(false);
			repertoireNouveauCluster.setReadable(true);

		} catch (IOException e) {
			System.out.println("probleme d'io lors de la creation d'un reprtoire");
			e.printStackTrace();
			System.exit(1);
		}

		System.out.println("le repertoire existe: "+repertoireNouveauCluster.exists());
		System.out.println("est un repertoire ? : "+repertoireNouveauCluster.isDirectory());
		System.out.println("fin de la création du repertoire");


		System.out.println("test de deplacement et de copi des fichiers");

		//creation des fichiers correspondants
		File repertoire2 = new File("outputHTML/test/repertoireSource");
		System.out.println("le dossier repertoireSource existe : "+repertoire2.exists()+" , c'est un dossier : "+repertoire2.isDirectory());

		File repertoire3 = new File("outputHTML/test/repertoireDestination");
		System.out.println("le dossier repertoireDestination existe : "+repertoire2.exists()+" , c'est un dossier : "+repertoire2.isDirectory());



		File[]fichiersACopier = repertoire2.listFiles();
		Source[] sourcesFichiersACopier  = new Source[fichiersACopier.length];
		String[] destinationFichiersACopier = new String[fichiersACopier.length];

		for(int i = 0; i < fichiersACopier.length;i++){
			try {
				sourcesFichiersACopier[i] = new Source(fichiersACopier[i].getCanonicalPath());
				destinationFichiersACopier[i]  = repertoire3.getCanonicalPath();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		// on cree un copyJob avec toutes les copy a faire

		CopyJob copyJob = new CopyJob(sourcesFichiersACopier, destinationFichiersACopier);
		FileCopier fileCopier = new FileCopier();
		try {
			fileCopier.copy(copyJob);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println("fin de la copi, le repertoire "+ repertoire3.getName() + " contient : "+repertoire3.list(null).toString() );


	}

}
